package BaseDatos;

import Modelo.Grupo;
import Modelo.Horario;
import Modelo.Profesor;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author Oscar
 */
public class GestorGrupo {
    
    
    private String URL_Servidor = "localhost";
    private static final String BASE_DATOS = "ADEHO";
    private static final String LOGIN = "root";
    private static final String PASSWORD = "root";
    private static final String CMD_LISTAR = "SELECT * from grupo;";
    private static final String CMD_OBTENER_GRUPO = "SELECT * FROM grupo WHERE seccion =?";
    private static final String CMD_INCLUIR = "INSERT into grupo VALUES (?,?,?)";
    private static final String CMD_BORRAR = "DELETE FROM grupo  WHERE nivel=? ORDER BY seccion DESC limit 1";
    private static final String CMD_OBTENER_SECCION = "SELECT * FROM grupo WHERE nivel=?";
    private static final String CMD_ULTIMA_SECCION = "SELECT seccion FROM grupo WHERE idNivel=? ORDER BY seccion DESC limit 1";
    private static final String CMD_ASIGNAR_PROFEGUIA = "INSERT into grupoProfesor values (?,?,?)";
    private static final String CMD_SECCION_PROFEGUIA = "SELECT seccion, profesorGuia FROM grupo";
    GestorProfesor gp = new GestorProfesor();
    GestorNivel gn = new GestorNivel();

    public ArrayList<Grupo> ListarGrupos() {
        ArrayList<Grupo> grupos = new ArrayList();
        GestorBD bd = null;
        String idNivel = "";
        String seccion = "";
        String profesorGuia = "";

        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_LISTAR);

            while (rs.next()) {
                idNivel = rs.getString(3);
                seccion = rs.getString(1);
                profesorGuia = rs.getString(2);
                Grupo g = null;
                if (profesorGuia != null) {
                    g = new Grupo(seccion, profesorGuia, idNivel);
                } else {
                    g = new Grupo(seccion, idNivel);
                }
                grupos.add(g);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return grupos;
    }
    
 

    public Grupo obtenerGrupo(String pSeccion) {
         Grupo g = new Grupo();
        GestorBD bd = null;
        String idNivel = "";
        String seccion = "";
        String profesorGuia = "";

        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery("Select * from grupo where seccion='"+pSeccion+"';");

             while (rs.next()) {
                idNivel = rs.getString(3);
                seccion = rs.getString(1);
                profesorGuia = rs.getString(2);
                g = null;
                if (profesorGuia != null) {
                    g = new Grupo(seccion, profesorGuia, idNivel);
                } else {
                    g = new Grupo(seccion, idNivel);
                }
                return g;
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return g;
    }

    public boolean registroGrupo(String nivel, int cantidad) {
        boolean exito = false;
        
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
          cnx.setAutoCommit(false);
          CallableStatement prodAlmacenado= cnx.prepareCall("{call addgrupos(?,?)}");
          prodAlmacenado.setInt("cant", cantidad);
          prodAlmacenado.setString("nivel",nivel);
          exito= prodAlmacenado.execute();
          cnx.commit();
            
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public String obtenerUltimaSeccion(String idNivel) {
        String seccion = null;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_ULTIMA_SECCION);
            stm.clearParameters();
            stm.setString(1, idNivel);
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                seccion = rs.getString(1);

            }
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return seccion;
    }

    public boolean AsignarProfesorGuia(String seccion, String cedula) {
        boolean asignado = false;
        GestorBD bd = null;
        int registrosActualizados = 0;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_ASIGNAR_PROFEGUIA);
            stm.clearParameters();
            stm.setString(1, cedula);
            stm.setString(2, seccion);
            stm.setString(3, "1");//PROVISIONAL 1
            registrosActualizados = stm.executeUpdate();
            asignado = registrosActualizados == 1;
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }

        return asignado;

    }
    
    public ArrayList<Grupo> obtenerSeccion(String nivel){
        ArrayList<Grupo> grupos = new ArrayList();
        GestorBD bd = null;
        String idNivel = "";
        String seccion = "";
        String profesorGuia = "";
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_SECCION);
            stm.clearParameters();
            stm.setString(1, nivel);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                idNivel = rs.getString(3);
                seccion = rs.getString(1);
                profesorGuia = rs.getString(2);
                Grupo g = null;
                if (profesorGuia != null) {
                    g = new Grupo(seccion,idNivel, gp.obtenerProfesor(profesorGuia).getNombre());
                } else {
                    g = new Grupo(seccion, idNivel);
                }
                grupos.add(g);
            }
           
            
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        
        return grupos;

        
    }
    
    public ArrayList<Grupo> obtenerGrupoProfeGuia(){
        ArrayList<Grupo> grupos = new ArrayList();
        GestorBD bd = null;
        String seccion = "";
        String profesorGuia = "";
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_SECCION_PROFEGUIA);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                seccion = rs.getString(1);
                profesorGuia = rs.getString(2);
                Grupo g = null;
                if (profesorGuia != null) {
                    g = new Grupo(seccion,null, gp.obtenerProfesor(profesorGuia).getNombre());
                } else {
                    g = new Grupo(seccion, null ,"No asignado");
                }
                grupos.add(g);
            }
           
            
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        
        return grupos;

        
    }
    
    public boolean eliminarGrupo(String nivel) {
        boolean borrado = false;
        int exito = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_BORRAR);
            stm.clearParameters();
            stm.setString(1, nivel);

            exito = stm.executeUpdate();
            if (exito != 0) {
                borrado = true;
            }
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

}
